package org.jeecg.modules.demo.crm.glm.kimi;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.volcengine.ark.runtime.model.completion.chat.ChatCompletionRequest;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import com.volcengine.ark.runtime.service.ArkService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;

@Service
public class KimiService {


    private final ArkService arkService;

    public KimiService(@Value("${kimi.api-key}") String apiKey) {
        ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.SECONDS);
        Dispatcher dispatcher = new Dispatcher();
        this.arkService = ArkService.builder()
                .dispatcher(dispatcher)
                .connectionPool(connectionPool)
                .apiKey(apiKey)
                .build();
    }

    /**
     * 根据项目上下文为产品推荐计量单位。
     *
     * @param productName
     * @return
     */
    public String recommendProductUnit(String productName, String projectScene) throws JsonProcessingException {
        // Construct the prompt with instructions and the user's input
        String prompt = "你是一个工程产品计量单位推荐助手。 请根据以下信息，推荐最合理的产品单位。 " +
                "要求： 1、必须结合项目场景，理解这是哪类工程（如：排线、照明、电气、土建、装修、安装等）； " +
                "2、必须结合产品在项目中的作用，判断它是线材、终端设备、区域、点位还是配件； " +
                "3、输出必须是行业中常用的计量单位（如：米、台、套、点、路、处、支、个等）； " +
                "4、不允许捏造，要贴合工程习惯； " +
                "返回格式： {'name':'产品名称','unit':'产品单位'} " +
                "输入示例： " +
                "   项目：" + productName +
                "   产品：" + projectScene;

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(ChatMessage.builder().role(ChatMessageRole.USER).content(prompt).build());

        ChatCompletionRequest req =
                ChatCompletionRequest.builder()
                        .model("kimi-k2-250905")
                        .messages(messages)
                        .build();

        try {
            String content = (String)arkService.createChatCompletion(req)
                    .getChoices()
                    .stream()
                    .findFirst()
                    .map(choice -> choice.getMessage().getContent())
                    .orElse("No recommendation found.");
            // 简单清洗掉 ```json 等包裹
            return content.replaceAll("```json|```", "").trim();
        } catch (Exception e) {
            throw new RuntimeException("调用Kimi推荐单位失败", e);
        }
    }


    public String quoteOcr(String filePath) throws JsonProcessingException {
        String prompt = "你是一个专业的内容提取助手。  \n" +
                "请根据我提供的文件内容，严格执行以下要求进行提取：  \n" +
                    "1. 读取文件中的表格或文本内容。  \n" +
                    "2. 精确提取以下字段：  \n" +
                    "   - 名称  \n" +
                    "   - 数量  \n" +
                    "   - 单位  \n" +
                    "   - 主材  \n" +
                    "   - 辅材  \n" +
                    "   - 人工  \n" +
                    "   - 备注  \n" +
                    "3. 输出必须是 **JSON 数组**，每一行/每一条记录对应一个 JSON 对象。  \n" +
                    "4. 字段必须完整输出，即使为空也要保留字段。  \n" +
                    "5. 确保提取内容 **真实准确，不允许虚构或捏造**。  \n" +
                    "6. 不需要解释或额外描述，只返回 JSON 结果。";


        List<ChatMessage> messages = new ArrayList<>();
        messages.add(ChatMessage.builder().role(ChatMessageRole.USER).content(prompt).build());
        messages.add(ChatMessage.builder().role(ChatMessageRole.USER).content(prompt).build());

        ChatCompletionRequest req =
                ChatCompletionRequest.builder()
                        .model("deepseek-v3-1-250821")
                        .messages(messages)
                        .build();

        try {
            String content = (String)arkService.createChatCompletion(req)
                    .getChoices()
                    .stream()
                    .findFirst()
                    .map(choice -> choice.getMessage().getContent())
                    .orElse("No recommendation found.");
            // 简单清洗掉 ```json 等包裹
            return content.replaceAll("```json|```", "").trim();
        } catch (Exception e) {
            throw new RuntimeException("调用Kimi推荐单位失败", e);
        }
    }
}
